package com.cloudpark.common.util.wechat;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.cloudpark.common.util.Constants;
import com.cloudpark.common.util.ObjectUtil;

public class MenuHandler {

	private static final Logger log = Logger.getLogger(MenuHandler.class);
	
	public static String customMenu(String action) {
		
		String appId = "wx13738d9cd4156a2f";
        String appSecret = "7487426b90a1af7c66c0350a828746d4";

        List<AccountMenu> menus = new ArrayList<AccountMenu>();
        AccountMenu menu1 = new AccountMenu();
        menu1.setParentid(0L);
        menu1.setId(1L);
        menu1.setName("停车缴费");
        menu1.setInputcode("QUERY_FEE"); // 就是微信菜单的KEY值
        menu1.setMtype("click");

        AccountMenu menu2 = new AccountMenu();
        menu2.setParentid(0L);
        menu2.setId(2L);
        menu2.setName("月卡充值");
        menu2.setMtype("view");
        menu2.setUrl(Constants.baseUrl + "/wechat/card?ecode=tdzn");

        AccountMenu menu3 = new AccountMenu();
        menu3.setParentid(0L);
        menu3.setId(3L);
        menu3.setName("我的");

        AccountMenu menu31 = new AccountMenu();
        menu31.setParentid(3L);
        menu31.setId(31L);
        menu31.setName("我的车辆");
        menu31.setMtype("view");
        menu31.setUrl(Constants.baseUrl + "/wechat/vehicle?ecode=tdzn");

        AccountMenu menu32 = new AccountMenu();
        menu32.setParentid(3L);
        menu32.setId(32L);
        menu32.setName("我的订单");
        menu32.setMtype("view");
        menu32.setUrl(Constants.baseUrl + "/wechat/order?ecode=tdzn");

        menus.add(menu1);
        menus.add(menu2);
        menus.add(menu3);
        menus.add(menu31);
        menus.add(menu32);
        
        JSONObject rstObj = new JSONObject();
        if (action.equals("publish")) {
        	 rstObj = WxManagerUtil.publishMenus(prepareMenus(menus), appId,
             appSecret);
        } else if (action.equals("delete")) {
        	rstObj = WxManagerUtil.deleteMenus(appId, appSecret);
        } else if (action.equals("select")) {
        	rstObj = WxManagerUtil.selectMenus(appId, appSecret);
        }
        log.info("自定义菜单返回结果:" + rstObj.toJSONString());
		return rstObj.toJSONString();
	}
	
	public static String prepareMenus(List<AccountMenu> menus) {

        if (null != menus && menus.size()>=1) {
            List<AccountMenu> parentAM = new ArrayList<AccountMenu>();
            Map<Long, List<JSONObject>> subAm = new HashMap<Long, List<JSONObject>>();
            for (AccountMenu m : menus) {
                if (m.getParentid() == 0L) {// 一级菜单
                    parentAM.add(m);
                } else {// 二级菜单
                    if (subAm.get(m.getParentid()) == null) {
                        subAm.put(m.getParentid(), new ArrayList<JSONObject>());
                    }
                    List<JSONObject> tmpMenus = subAm.get(m.getParentid());
                    tmpMenus.add(getMenuJSONObj(m));
                    subAm.put(m.getParentid(), tmpMenus);
                }
            }
            JSONArray arr = new JSONArray();
            for (AccountMenu m : parentAM) {
                if (subAm.get(m.getId()) != null) {// 有子菜单
                    arr.add(getParentMenuJSONObj(m, subAm.get(m.getId())));
                } else {// 没有子菜单
                    arr.add(getMenuJSONObj(m));
                }
            }
            JSONObject root = new JSONObject();
            root.put("button", arr);
            return root.toJSONString();
        }
        return "error";
    }
	
	private static JSONObject getMenuJSONObj(AccountMenu menu) {
        JSONObject obj = new JSONObject();
        obj.put("name", menu.getName());
        obj.put("type", menu.getMtype());
        if ("click".equals(menu.getMtype())) {// 事件菜单
            if ("fix".equals(menu.getEventType())) {// fix 消息
                obj.put("key", "_fix_" + menu.getMsgId());// 以 _fix_ 开头
            } else {
                if (ObjectUtil.isBlank(menu.getInputcode())) {// 如果inputcode为空，默认设置为subscribe，以免创建菜单失败
                    obj.put("key", "subscribe");
                } else {
                    obj.put("key", menu.getInputcode());
                }
            }
        } else {// 链接菜单-view
            obj.put("url", menu.getUrl());
        }
        return obj;
    }

    private static JSONObject getParentMenuJSONObj(AccountMenu menu, List<JSONObject> subMenu) {
        JSONObject obj = new JSONObject();
        obj.put("name", menu.getName());
        obj.put("sub_button", subMenu);
        return obj;
    }
}
